package com.cskaoyan.javase.oop2._1extends._3advantage;

/**
 * 这里给出一个继承语法的练习案例，通过案例我们来分析一下继承的优缺点：
 * 练习：
 * 在一款游戏中，我们设计了三种类型的鸭子，这些鸭子有一些共同的属性，也有共同的行为，比如都可以叫，都会游泳等。
 * 编写程序，描述这些鸭子。
 * 后来，需求更改了，这些鸭子不能游泳了，但是都会飞，怎么改呢？
 * 再后来，需求又改了，新增了一种鸭子，但这个鸭子不会飞，又怎么办呢？
 *
 * 继承的优点:
 *      1.继承打破了引用数据类型的类型限制,使引用数据类型可以发生类型转换.
 *      2.继承实现了成员复用,简化了代码.
 *      3.实现了继承,实现了代码复用,可以提升程序的扩展性和可维护性
 * 继承的缺点:
 *      子类无法选择继承父类的何种成员,只是被动的无脑全部接受
 *
 * @since 10:22
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        FirstTypeDuck ftd = new FirstTypeDuck();
        System.out.println(ftd.age);
        ftd.shout();
        ftd.fly();

        ForthTypeDuck d = new ForthTypeDuck();
        d.fly();
    }
}

class DuckFather {
    int age;
    String name;

    public void shout() {
        System.out.println("嘎嘎嘎!");
    }

    /*public void swim() {
        System.out.println("我是鸭子,我会游泳!");
    }*/

    public void fly(){
        System.out.println("我是鸭子,我会飞!");
    }
}

class FirstTypeDuck extends DuckFather {

}

class SecondTypeDuck extends DuckFather {
}

class ThirdTypeDuck extends DuckFather {
}

class ForthTypeDuck extends DuckFather{
    // 虽然子类不能选择继承父类的何种成员,但是子类可以在继承父类方法的同时选择重写父类方法实现,称之为"方法的重写"
    public void fly(){
        System.out.println("产品经理说我不会飞,那我不飞了!");
    }
}